#include <iostream>
#include "Test.h"

class Base
{
public:
	Base() {

	}

	Base(int x, int y) {

	}
};

class Derived: public Base
{
public:
	Derived() {}
};

template<class T>
class templateclass
{
public:
	T x;

	void function() {
		printf("hello, world\n");
	}

	void spec() {
		printf("I am the template T instance\n");
	}
};

template<>
class templateclass<int>
{
public:
	int x;

	void spec() {
		printf("I am the template int instance\n");
	}
};

template<>
class templateclass<float>
{
public:
	float x;

	void spec() {
		printf("I am the template float instance\n");
	}
};

struct StructType
{
	int x, y;
};


// template <typename Type, typename Size>
// struct Buf {
// 	union {
// 		struct { Type x, y; };
// 		Type data[Size];
// 	};
// };
// 
// template <typename Type>
// struct Buf<3> {
// 	union {
// 		struct { Type x, y, z; };
// 		Type data[3];
// 	};
// };
// 
// template <typename Type>
// struct Buf<4> {
// 	union {
// 		struct { Type x, y, z, w; };
// 		Type data[4];
// 	};
// };
// 
// // template <typename Type, typename Size>
// // struct vec_trait {
// // 	
// // };
// 
// template <class T,
// class Size,
// class buffertype,
// class lowerbond,
// class upperbond,
// class defaultvalue
// >
// struct RawVec: public Buf<T, Size>
// {
// 	
// };

// 	template <class T, 
// class lowerbond,
// class upperbond,
// class defaultvalue
// 	>
// struct RawColor4
// {
// 	static const int DEMENSION = 4;
// 	typedef T Type;
// 
// 	union {
// 		struct { Type r, g, b, a };
// 		Type data[DEMENSION];
// 	};
// 
// 	RawColor4():
// 	r(defaultvalue), g(defaultvalue), b(defaultvalue), a(defaultvalue){};
// 	RawColor4(Type _r, Type _g, Type _b, Type _a = defaultvalue):
// 	r(_r), g(_g), b(_b), a(_a) {};
// 
// 	RawColor4 blend(const RawColor4& p, BlendType f) {
// 		return RawColor4();
// 	}
// 
// protected:
// 	inline void adjust() {
// 		for (int i = 0; i < DEMENSION; i ++) {
// 			adjustelement(data[i]);
// 		}
// 	}
// 	inline Type factor() const{ return 1; }
// 
// private:
// 	inline void adjustelement(Type& x) {
// 		if (x > upperbond) x =upperbond;
// 		else if (x < lowerbond) x = lowerbond;
// 	}
// };



class CppPropertiesTest: public TestCase
{
public:
	void proc()
	{
		//Derived d(1, 2);
		templateclass<char> tchar;
		templateclass<int> tint;
		templateclass<float> tfloat;

// 		int *aa = new int[100];
// 		for (int i = 0; i < 100; i ++) {
// 			printf("%0x ", (int)(aa+i));
// 		}
// 		printf("%0x ", (int)(aa+102));

		tchar.function();
		StructType a, b;
		a.x = 10, a.y = 20;
		b.x = 1, b.y = 2;

// 		StructType c = a + b;
// 		printf("%d %d\n", c.x, c.y);
		//tint.function();
	}
};